/**
 * 依赖注入
 * Dependency Injection
 */

class A {
  name: string

  constructor(name: string) {
    this.name = name
  }
}

class B {
  age: number
  entity: A
  constructor(age: number) {
    this.age = age

    this.entity = new A('A类')
  }
}

const bInstance = new B(12)

console.log(bInstance.entity.name)

// ------
/**
 * 上述 A类的改变，会直接影响到B类，  A类和B类形成了耦合
 */

class C {
  age: number
  constructor(age: number) {
    this.age = age
  }
}

/**
 * 中间类 - 用于解耦上述A类和B类
 */
class Container {
  modules: any

  constructor() {
    this.modules = {}
  }

  /**
   * 注入依赖 - 交由 Container 统一管理
   * @param key
   * @param module
   */
  provide(key: string, module: any) {
    this.modules[key] = module
  }

  get(key) {
    return this.modules[key]
  }
}

const mo = new Container()

mo.provide('a', new A('张三'))
mo.provide('c', new C(12))

// 上面 mo 容器注入了多少实例， 下面的D  就可以取多少，达到具体的  A类 和C类的解耦

class D {
  a: A
  c: C

  constructor(container: Container) {
    this.a = container.get('a')

    console.log(this.a.name)

    this.c = container.get('c')
  }
}

new D(mo)
